package com.roy.HadoopRPCDemo.bean;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

import org.apache.hadoop.io.Writable;
import org.mortbay.util.ajax.JSON;

/**
 * 实现hadoop 的 writable接口，对象就可以在hadoop的RPC框架中进行传输。 hadoop的mapreduce也是用的这个RPC框架。
 * 实现wirtable后，可以在map中返回。
 * 但是不同的是，如果要在reduce中计算，还需要实现java.lang.Comparable接口，这样才能在shuffle中排序。 hadoop封装了
 * WritableComparable 接口来统一这两个接口。
 */
public class UserBean implements Writable {
	// 如果字段未初始化，RPC调用时会抛出空指针异常。
	private int userId = -1;
	private String userName = "";
	private String userPassword = "";
	private String userInfo = "";

	public int getUserId() {
		return userId;
	}

	public void setUserId(int userId) {
		this.userId = userId;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getUserPassword() {
		return userPassword;
	}

	public void setUserPassword(String userPassword) {
		this.userPassword = userPassword;
	}

	public String getUserInfo() {
		return userInfo;
	}

	public void setUserInfo(String userInfo) {
		this.userInfo = userInfo;
	}

	/**
	 * Writable接口方法。实现如何把对象写入到流中。
	 */
	public void write(DataOutput out) throws IOException {
		out.writeInt(userId);
		out.writeUTF(userName);
		out.writeUTF(userPassword);
		out.writeUTF(userInfo);
	}

	/**
	 * Writable接口方法。实现如何把对象从流中读出来。 这个场景只要与write按同样的顺序读字段就行。
	 * 其他实现可以参看一下hadoop里的几个*writable类。
	 * 
	 */
	public void readFields(DataInput in) throws IOException {
		this.userId = in.readInt();
		this.userName = in.readUTF();
		this.userPassword = in.readUTF();
		this.userInfo = in.readUTF();
	}

	public String toString() {
		return "[usreId = " + userId + ";userName=" + userName + "; userPassword=" + userPassword + ";userInfo = "
				+ userInfo + "]";
	}

}
